home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48hor2 / line < prev    next >
Text File  |  1995-03-31  |  5KB  |  276 lines

  1. %%HP: T(3)A(D)F(.); 
  2. "********************** 
  3. * Name: Line 
  4. *  draw/clear/toggle 
  5. *  line in a GROB 
  6. * Interface: 
  7. *  gr #x1 #y1 #x2 #y2 
  8. *  --> 
  9. *  #x1 must be < #x2. 
  10. * Error Exits: none 
  11. * Alters: 
  12. *  CPU - A,B,C,D,D0, 
  13. *  D1,R0,R1,R2,R3,R4, 
  14. *  P,CRY 
  15. *  RAM - gr and coord. 
  16. *  popped 
  17. * Calls: 
  18. *  =POP# =SAVPTR 
  19. *  =PopASavptr 
  20. *  =GETPTRLOOP 
  21. * Stk Levels: 
  22. *  1 
  23. * Notes: 
  24. *  std. DDA 
  25. *  The routine works 
  26. *  only on VDISP yet, 
  27. *  assuming x-size = 
  28. *  131 (real 136 -> 
  29. *  34 nibb/line). 
  30. *  !!! BANG TYPE !!! 
  31. * History: 
  32. *  05/20/92 DM 
  33. *   Implemented as 
  34. *   test for QIX. Q&D! 
  35. *  07/11/92 DM 
  36. *   review, add spec. 
  37. *   cases, cond.ass. 
  38. ********************** 
  39.  
  40. Toggle EQU 0 Set only 
  41. On     EQU 0 one to 1 
  42. Off    EQU 1 at a time! 
  43.  
  44. sFlag  EQU 5 
  45.  
  46. ***** 
  47. * Pop parameter,calc. 
  48. * and check dx 
  49. ***** 
  50.      GOSUB  Pop# 
  51.      R3=A         y2 
  52.      GOSUB  Pop# 
  53.      R2=A         x2 
  54.      GOSUB  Pop# 
  55.      R1=A         y1 
  56.      GOSUB  Pop# 
  57.      R0=A         x1 
  58. *1*  GOSBVL =PopASavptr  ->grob 
  59.  
  60.      GOSBVL =SAVPTR *1* 
  61.      D0=(5) =VDISP  *1* ->->grob 
  62.      A=DAT0 A       *1* ->grob 
  63.  
  64.      D0=A         ->grob 
  65.  
  66.      A=R0         x1 
  67.      C=R2         x2 
  68.      C=C-A  A     dx=x2-x1 
  69.      GONC   dxok 
  70.      GOTO   Exit  Sorry,invalid order 
  71. dxok R2=C         dx 
  72.  
  73. ***** 
  74. * Calculate ystep, 
  75. * pointer to grob and 
  76. * initial bit mask 
  77. ***** 
  78.      D0=D0+ 15    ->x, Skip prlg,len,y 
  79. *2*  C=DAT0 A     x 
  80. *2*  C=C+CON A,7  Force byte boundary 
  81. *2*  CSRB.F A 
  82. *2*  CSRB.F A 
  83. *2*  CSRB.F A 
  84. *2*  C=C+C  A     nibb/line 
  85.      LC(5)  34    *2* nibb/line 
  86.  
  87.      D=C    A     ys 
  88.      D0=D0+ 5     ->pix,Skip x 
  89.      A=R1         y1 
  90.  
  91. * unsigned C*=A (org.HP) 
  92.  
  93.      B=0    A 
  94.      BCEX   A 
  95. Mul2 B=B-1  P 
  96.      GOC    Mul3 
  97.      C=C+A  A 
  98.      GOTO   Mul2 
  99. Mul3 ASL    A 
  100.      P=P+1 
  101.      ?P#    5 
  102.      GOYES  Mul2 
  103.      P=     0 
  104.  
  105.      A=R0         x1,y1*nibb/line 
  106.      ASRB.F A 
  107.      ASRB.F A     /=4 
  108.      A=A+C  A     offs=x1/4+y1*nibb/line 
  109.  
  110.      CD0EX        ->pix 
  111.      C=C+A  A     +=offs 
  112.  
  113.      D0=C         ->nibb 
  114. * Now some magic 
  115.      A=R0         x1 
  116.      LC(1)  3 
  117.      C=C&A  B     x1%4 
  118.      C=C+CON B,13 +=13 
  119.      P=C    0 
  120.      LC(4)  #1248 
  121.      P=C    0 
  122.      C=P    1 
  123.      P=     0 
  124.      B=C    B     mask 
  125.  
  126.   IFNE Off 
  127.      B=-B-1 B     OFF mask 
  128.   ENDIF 
  129.  
  130. ***** 
  131. * Calculate dy, check 
  132. * for special cases 
  133. * dx=0,dy=0 or dx=dy 
  134. ***** 
  135.      A=R1         y1 
  136.      C=R3         y2 
  137.      C=C-A  A     dy=y2-y1 
  138.      GONC   tstdxy 
  139.      D=-D   A     -ys 
  140.      C=-C   A     -dy 
  141. tstdxy 
  142.      ST=0   sFlag 
  143.      A=R2         dx 
  144.  
  145.      ?C=A   A 
  146.      GOYES  dxeqdy dx=dy 
  147.      ?A=0   A 
  148.      GOYES  dxeq0 dx=0 
  149.      ?C#0   A 
  150.      GOYES  dxgtdy? dy<>0 
  151.  
  152. * dy=0,set up x steps 
  153.      D1=A         cnt = dx 
  154.      GONC   dx1dy0 BET 
  155.  
  156. * dx=0,set up y steps 
  157. dxeq0 
  158.      ST=1   sFlag 
  159.      D1=C         cnt=dy 
  160. dx1dy0 
  161.      A=0    A 
  162.      A=A+1  A     dx=1 
  163.      C=0    A     dy=0 
  164.      GONC   dxdycok BET 
  165.  
  166. * dx=dy,set up x&y steps 
  167. dxeqdy 
  168.      D1=A         cnt=dx 
  169.      A=0    A     dx=0 
  170.      C=0    A     dy=0 
  171.      GOC    dxdycok BET 
  172.  
  173. Exit GOVLNG =GETPTRLOOP 
  174.  
  175. ***** 
  176. * Normal case, check 
  177. * for dy>=dx, calc. e 
  178. ***** 
  179. dxgtdy? 
  180.      ?C<A   A 
  181.      GOYES  dxdyok 
  182.  
  183.      ST=1   sFlag dy>dx,swap dx, dy 
  184.      ACEX   A 
  185.  
  186. dxdyok 
  187.      D1=A         cnt=dx 
  188.  
  189. dxdycok 
  190.      R2=A         dx 
  191.      R3=C         dy 
  192.  
  193.      ASRB.F A     dx/2 
  194.      R4=A         e 
  195.  
  196. ***** 
  197. * The show begins... 
  198. ***** 
  199. plot A=DAT0 1     Read nibble 
  200.  
  201.   IFNE On 
  202.      A=A!B  B     Set bit 
  203.   ENDIF 
  204.   IFNE Off 
  205.      A=A&B  B     Clear bit 
  206.   ENDIF 
  207.   IFNE Toggle 
  208.      C=A    B 
  209.      A=A!B  B 
  210.      C=C&B  B 
  211.      A=A-C  B 
  212.   ENDIF 
  213.  
  214.      DAT0=A 1     Write nibble 
  215.  
  216.      D1=D1- 1     --cnt 
  217.      GOC    Exit 
  218.  
  219.      A=R4.F A     e 
  220.      C=R3.F A     dy 
  221.      A=A+C  A     e+=dy 
  222.      R4=A.F A     e 
  223.      C=R2.F A     dx 
  224.  
  225.      ?ST=1  sFlag 
  226.      GOYES  allwy 
  227.  
  228.      ?A<C   A 
  229.      GOYES  xstep e>=dx 
  230.  
  231.      A=A-C  A     e-=dx 
  232.      R4=A.F A     e 
  233.      CD0EX        ->pix 
  234.      C=C+D  A     ->next row 
  235.      D0=C         ->pix 
  236.  
  237. xstep 
  238.      B=B+B  B     mask<<=1 
  239.   IFNE (On)+(Toggle) 
  240.      GONC   plot 
  241.      LC(2)  #11   init.mask 
  242.   ENDIF 
  243.   IFNE Off 
  244.      GOC    plot 
  245.      LC(2)  #EE 
  246.   ENDIF 
  247.      B=C    B     mask 
  248.      D0=D0+ 1     ->nxt nibb 
  249.      GONC   plot  BET 
  250.  
  251. allwy 
  252.      ?A<C   A 
  253.      GOYES  ystep e>=dx 
  254.  
  255.      A=A-C  A     e-=dx 
  256.      R4=A.F A     e 
  257.  
  258.      B=B+B  B     mask <<= 1 
  259.   IFNE (On)+(Toggle) 
  260.      GONC   ystep 
  261.      LC(2)  #11   init. mask 
  262.   ENDIF 
  263.   IFNE Off 
  264.      GOC    ystep 
  265.      LC(2)  #EE 
  266.   ENDIF 
  267.      B=C    B     mask 
  268.      D0=D0+ 1     ->nxt nibb 
  269.  
  270. ystep 
  271.      CD0EX        ->pix 
  272.      C=C+D  A     ->next row 
  273.      D0=C         ->pix 
  274.      GOTO   plot 
  275.  
  276. Pop# GOVLNG =POP#"